package com.ddyx.common.framework.config;

import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.HibernateValidator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

/**
 * <p>
 *      Spring Boot中使用Validator需要注意一个问题。
 *      默认情况下在控制器中通过使用@Valid注解和校验模型只能在POST请求中生效，GET请求没有效果。
 *      所以，在配置时，需要用到Spring对Validator的拓展。
 * </p>
 * author: agula
 * since: 2019-07-16  11:42
 */
@Slf4j
@Configuration
public class ValidatorConfig {


    /**
     * Validator的默认配置
     * @author agula
     * @date 2019-07-16 11:43
     */
    @Bean
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
                .configure()
                .addProperty("hibernate.validator.fail_fast", "true") //快速验证模式，有第一个参数不满足条件直接返回
                .buildValidatorFactory();
        return validatorFactory.getValidator();
    }

    /**
     * 对默认配置的拓展，解决GET请求参数的校验
     * @author agula
     * @date 2019-07-16 11:43
     */
    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
        postProcessor.setValidator(validator());
        return postProcessor;
    }

}
